#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include <termios.h> 
#include <stdio_ext.h>

#include "input_type.h"

/**
 * @brief   获取输入
 * @param   str:指向装载输入的字符串的指针。
 * @return  错误返回错误信息
 */
int get_str_input(char *str)
{
    int length;

    if (!str) {
        return -1;
    }

    length = INPUT_LENGTH;
    memset(str, '\0', length);

    fgets(str, length, stdin);
    __fpurge(stdin);
    if (str[strlen(str) - 1] == '\n')
        str[strlen(str) - 1] = '\0';
    
    return 0;
}

/**
 * @brief   判断字符串是否为 大小写字母或数字。
 * @param   str：指向字符串的指针（字符串一般是通过get_str_input();得到的输入）。
 * @return  符合返回——1 不符合返回——0 错误返回错误信息
 */
int get_num_char(char *str)
{
    uint8_t count;
    uint8_t ret;

    if (!str) {
        return -1;
    }

    for (count = 0; count < INPUT_LENGTH; count++) {

        if (str[count] == '\0')
            break;
        if ((str[count] >= '0' && str[count] <= '9') ||
            (str[count] >= 'A' && str[count] <= 'Z') ||
            (str[count] >= 'a' && str[count] <= 'z'))
            ret = TRUE;
        else
            return FALSE;
    }
    return ret;
}

/**
 * @brief   判断字符串是否y，Y，n，N。
 * @param   str:指向字符串的指针(字符串一般是通过get_str_input();得到的输入)。
 * @return  符合返回——1 不符合返回——0 错误返回错误信息
 */
int get_yes_no(char *str)
{
    uint8_t length;
    char input;

    if (!str) {
        return -1;
    }

    length = strlen(str);
    if (length != 1)
        return FALSE;

    input = str[0];
    if (input == 'y' ||
       input == 'Y' ||
       input == 'n' ||
       input == 'N')
        return TRUE;
    else
        return FALSE;
}

/**
 * @brief   判断字符串是否为纯数字。
 * @param   str：指向字符串的指针（字符串一般是通过get_str_input();得到的输入）。
 * @return  符合返回——1 不符合返回——0 错误返回错误信息
 */
int get_num(char *str)
{
    uint8_t count;

    if (!str) {
        return -1;
    }

    for (count = 0; count < INPUT_LENGTH; count++) {

        if (str[count] == '\0')
            break;
        if (str[count] < '0' || str[count] > '9')
            return FALSE;
    }
    return TRUE;
}

/**
 * @brief   模拟实现无回显的getch。
 * @param   void
 * @return  成功返回0, 失败返回-1
 */
int getch_echoless(void)
{
    struct termios temp_setting, old_setting;
    int ch;

    if (tcgetattr(fileno(stdin), &temp_setting) < 0) {
        return -1;
    }

    old_setting = temp_setting;
    cfmakeraw(&temp_setting);
    if (tcsetattr(fileno(stdin), TCSANOW, &temp_setting) < 0) {
        return -1;
    }
    ch = getchar();
    if (tcsetattr(fileno(stdin), TCSANOW, &old_setting) < 0) {
        return -1;
    }

    return ch;
}